/*Universidad el Valle de Guatemala
 * Hoja de Trabajo 4
 * 
 * Carlos Sagastume, 12113
 * Rodimiro Castañeda, 12122
 * Juan Fernando Moraflores 
 * 
 * Descripcion:
 *  Programa que permite al usuario ingresar la direccion de un archivo .txt
 * que contenga una operacion postfix y esta es resulta por medio de la utilizacion
 * ya sea de listas, arraylist o vectores.
 */



package Stack;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Scanner;
public class main {
    public static void main (String [] args)
    {
        // se crea el objeto de scanner para el ingreso de datos
        Scanner scan = new Scanner(System.in);
        // se le pide al usuario que ingrese el directorio de donde se encuentra el archivo .txt
        System.out.println("Ingrese el directorio de donde se encuentra el archivo .txt:");
        String directorio = scan.nextLine();
        
        // se lee el archivo de texto indicado
        // contador que permite conocer cuantos caracteres se encuentran el en texto
        int contador=0;
        // array que contiene el texto del archivo .txt
        String textocompleto = "";
        String[] elementos;
        try{
            // Abrimos el archivo
            FileInputStream fstream = new FileInputStream(directorio);
            // Creamos el objeto de entrada
            DataInputStream entrada = new DataInputStream(fstream);
            // Creamos el Buffer de Lectura
            BufferedReader buffer = new BufferedReader(new InputStreamReader(entrada));
            String strLinea;
            // Leer el archivo linea por linea
            while ((strLinea = buffer.readLine()) != null)   {
                 // se le suma uno al contador
                contador++;
                // Imprimimos la línea por pantalla
//                System.out.println (strLinea);
                textocompleto = textocompleto+strLinea;
//                String[] elementos = strLinea.split("@"); 
            }
            // Cerramos el archivo
            entrada.close();
        }catch (Exception e){ //Catch de excepciones
            System.err.println("Ocurrio un error: " + e.getMessage());
        }
 //      System.out.println(textocompleto);
       // pasando el texto a un array
       elementos = textocompleto.split(" "); 
       System.out.println("Texto obtenido del archivo: ");
       for (int i =0; i<elementos.length; i++)
       {
           System.out.print(elementos[i]);
       }
       System.out.println("");
        /*********************************************************************/
        
        // se crea el objeto seleccion en el que por medio de Factory se seleccionara el timpo de arreglo a utilizar
        Factory<Integer> seleccion = new Factory<Integer>();
        // se le pregunta al usuario que tipo de arreglo quiere utilizar
        System.out.println("Ingrese el numero de Stack que desea implementar:\n"
                + "1- Stack con ArrayList\n"
                + "2- Stack con Vectores\n"
                + "3- Stack con Listas");
        // se lee lo que ingresa el usuario
        int opc = scan.nextInt();
        // se crea la lista segun haya deseado el usuario
iStack<Integer> lista = seleccion.getStack(opc);
// se puede utilizar en lista los metodos del arreglo que haya seleccionado el usuario


      int tamañototal = elementos.length;
      int i =0;
      int resultado = 0;
      int contador2 = 0;
       while (i<tamañototal) {
            String s = elementos[i];
            contador2++;
            if (s.equals("+")){
                lista.push((Integer)lista.pop() + (Integer)lista.pop());
            }
            else if (s.equals("*")){
                lista.push((Integer)lista.pop() * (Integer)lista.pop());
            }
            else if (s.equals("/")){
                lista.push((Integer)lista.pop() / (Integer)lista.pop());
            }
            else if (s.equals("-")){
                lista.push((Integer)lista.pop() - (Integer)lista.pop());
            }
            else {
                lista.push(Integer.parseInt(s));
            }
            i++;
        }
        System.out.println("El resultado es: "+lista.pop());
    }
    }


/*

        System.out.println("Tamaño de Lista: "+String.valueOf(lista.size()));
       lista.push(1);
       System.out.println("Tamaño de Lista: "+String.valueOf(lista.size()));
       lista.push(2);
       lista.push(3);
       System.out.println("Tamaño de Lista: "+String.valueOf(lista.size()));
       int numero = lista.pop();
       lista.pop();
       System.out.println("Tamaño de Lista: "+String.valueOf(lista.size()));
    System.out.println(""+numero);}}
       
       
       */

        
  /*      
ListaCircular hola = new ListaCircular();
NodoListaSimple hola2;
hola.push(1);
hola.push(2);
//System.out.println(hola.size());
hola.push(3);
//hola.Mostrar();
System.out.println("\n");
//System.out.println(""+hola2.getDato());
System.out.println("\n");
//System.out.println(""+hola2.toString());
System.out.println("\n");
//hola.push(4);
hola2 = (NodoListaSimple)hola.pop();
hola2 = (NodoListaSimple)hola.pop();
//System.out.println("\n ultimo dado extraido:\n"+hola2.getDato());
System.out.println("\n------\n");
hola.push(4);
hola.push(5);
hola.pop();
hola.pop();
hola.push(6);
hola.pop();
hola.pop();
hola.pop();
hola.pop();
hola.pop();
hola.push(8);
hola.Mostrar();*/
